package com.hyh.generator.config;


import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.config.*;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
import com.hyh.ad.common.core.domain.AjaxResult;
import com.hyh.generator.domain.TableInfo;
import lombok.extern.slf4j.Slf4j;

import java.util.HashMap;
import java.util.Map;


/**
 * 读取代码生成相关配置
 */

@Slf4j
public class Generator {
    /**
     * 配置数据源的bean
     *
     * @param
     * @return DataSourceConfig
     */
    public DataSourceConfig dataSourceConfig() {
        DataSourceConfig dataSourceConfig = new DataSourceConfig();
        dataSourceConfig.setUrl( "jdbc:mysql://localhost:3306/sys_base_framework?serverTimezone=UTC"); // 数据库url
        dataSourceConfig.setDriverName("com.mysql.cj.jdbc.Driver"); // 数据库驱动
        dataSourceConfig.setUsername("root"); // 数据库用户名
        dataSourceConfig.setPassword("1459hyh."); // 数据库密码
        return dataSourceConfig;
    }

    /**
     * 配置代码生成器的bean 全局配置
     *
     * @param
     * @return GlobalConfig
     */

    public GlobalConfig globalConfig(TableInfo tableInfo) {
        if(tableInfo.getAuthor() == null){
            tableInfo.setAuthor("hyh");
        }
        GlobalConfig globalConfig = new GlobalConfig();
        String outputDir = System.getProperty("user.dir") + "/generatorCode";
        globalConfig.setOpen(false); // 是否打开输出目录
        globalConfig.setOutputDir(outputDir); // 生成文件的输出目录
        globalConfig.setAuthor(tableInfo.getAuthor()); // 作者
        globalConfig.setOpen(true); // 生成后是否打开资源管理器
        globalConfig.setFileOverride(true); // 是否覆盖已有文件
        globalConfig.setMapperName("%sMapper"); // 设置生成的mapper接口 %s是占位符 会自动填充表实体的名字
        globalConfig.setServiceName("I%sService"); // 设置生成的service接口的名字的首字母是否为I
        globalConfig.setIdType(IdType.ASSIGN_ID); // 主键策略
        return globalConfig;
    }

    /**
     * 配置代码生成器的bean 包配置
     *
     * @return PackageConfig
     */

    public PackageConfig packageConfig(TableInfo tableInfo)
    {
        if(tableInfo.getPackageName() == null){
            tableInfo.setPackageName("com.hyh.admin");
        }

        if(tableInfo.getEntityName() == null){
            tableInfo.setEntityName("domain");
        }

        if(tableInfo.getInterfaceName() == null){
            tableInfo.setInterfaceName("mapper");
        }
        PackageConfig packageConfig = new PackageConfig();
        packageConfig.setParent(tableInfo.getPackageName()); // 设置生成的包名
        packageConfig.setEntity(tableInfo.getEntityName()); // 设置生成的实体类的包名
        packageConfig.setMapper(tableInfo.getInterfaceName()); // 设置生成的mapper接口的包名
        packageConfig.setService("service"); // 设置生成的service接口的包名
        packageConfig.setServiceImpl("service.impl"); // 设置生成的service实现类的包名
        packageConfig.setController("controller"); // 设置生成的controller的包名
        return packageConfig;
    }

    /**
     * 配置代码生成器的bean 策略配置
     *
     * @return AutoGenerator
     */

    public StrategyConfig strategyConfig(TableInfo tableInfo) {
        StrategyConfig strategyConfig = new StrategyConfig();
        // 下划线转驼峰命名
        strategyConfig.setNaming(NamingStrategy.underline_to_camel);
        strategyConfig.setInclude(tableInfo.getTableName()); // 设置要映射的表名
        //strategyConfig.setTablePrefix("sys_"); // 设置表前缀
        strategyConfig.setLogicDeleteFieldName("deleteFlag"); // 逻辑删除字段
        strategyConfig.setEntityLombokModel(true); // 是否使用lombok
        strategyConfig.setRestControllerStyle(true); // 是否使用rest风格
        return strategyConfig;
    }


    /**
     * 代码生成
     * @param tableInfo
     * @return
     */
    public AjaxResult generator(TableInfo tableInfo) {
        log.info("代码生成开始{} 表名 :" , tableInfo.getTableName());
        AutoGenerator mpg = new AutoGenerator();
        mpg.setDataSource(dataSourceConfig());
        mpg.setGlobalConfig(globalConfig(tableInfo));
        mpg.setStrategy(strategyConfig(tableInfo));
        mpg.setPackageInfo(packageConfig(tableInfo));
        // 执行生成
        mpg.execute();
        Map<String, String> result = new HashMap<>();
        result.put("表名", tableInfo.getTableName());
        result.put("代码存放路径", System.getProperty("user.dir") + "/generatorCode");
        result.put("生成成功", "true");
        return AjaxResult.success(result);
    }
}
